#include "key.h"
#include "stdio.h"


unsigned char Key_Scan_Time[9]={0,0,0,0,0,0,0,0,0};
unsigned char  Key_Scan_Cnt[9]={0,0,0,0,0,0,0,0,0};
uint16_t	KeyNum;
static uint8_t counter ;

/*
按键值：
	单击：1，2，3，4，5，6，7，8；
	双击：11，22，33，44，55，66，77，88；
	长按： 111，222，333，444，555，666，777；

*/
//调用时在主函数中extern KEYStruct KeyStruct，读取其中Num的值即可
KEYStruct KeyStruct;

typedef enum {
	push,
	untie
}key_state;

unsigned char Key_Getstate(void)
{
	unsigned char KeyNumber = 0;
	
	if(push == HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)){KeyNumber = 1;}
	if(push == HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)){KeyNumber = 2;}
	if(push == HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)){KeyNumber = 3;}
	if(push == HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin)){KeyNumber = 4;}
	if(push == HAL_GPIO_ReadPin(KEY5_GPIO_Port,KEY5_Pin)){KeyNumber = 5;}
	if(push == HAL_GPIO_ReadPin(KEY6_GPIO_Port,KEY6_Pin)){KeyNumber = 6;}
	if(push == HAL_GPIO_ReadPin(KEY7_GPIO_Port,KEY7_Pin)){KeyNumber = 7;}
	if(push == HAL_GPIO_ReadPin(KEY8_GPIO_Port,KEY8_Pin)){KeyNumber = 8;}
	
	return KeyNumber;
}


/*
总体思路就是：

1.在定时器中重复记录按键的返回值，如果此次的返回值为0而上一次的返回值不为0，则判断为按键已被按下并松手。

2.在定时器中重复记录按键的返回值，如果此次的返回值为0且上一次的返回值也为0，则判断为按键正在被长按，开启长按计时，等待松手时检测计时是否满足长按时长的要求。

3.在定时器中重复记录按键的返回值，如果检测到按键被按下并松手，则开启双击计时，当计时处于一定数值内时再次被按下，则判断为双击；若超时仍未有按键按下，则判断为单击。

4.第一次按键松开时，NumSave储存第一次按键值，若第二次按键值与之相同，则判断为双击，三击同理。

*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static unsigned char Key_NowSta = 0,Key_LastSta = 0;
	if(htim->Instance == TIM2)
	{

//        counter ++ ;
//        counter %= 5 ;   //120ms
//        
//        if( counter == 0 )        
        {
            Key_LastSta = Key_NowSta ;
            Key_NowSta = Key_Getstate() ;
            
            if( KeyStruct.W_TouchCounter_Flag == 1 && KeyStruct.W_Touch_TimeCounter < 200 )
            {
                KeyStruct.W_Touch_TimeCounter ++ ;
								//printf("W_Touch_TimeCounter:%d\r\n", KeyStruct.W_Touch_TimeCounter);
            }        
            
            if( Key_NowSta == Key_LastSta && Key_NowSta != 0 && KeyStruct.Key_TimeCounter < 200 ) //长按判断
            {
                KeyStruct.Key_TimeCounter ++ ;
            }       
            else
            {
                    if( Key_NowSta == 0 && Key_LastSta != 0 )     //松开按键
                {
                
                    if( KeyStruct.Key_TimeCounter >= 25 )
                    {
                        KeyStruct.Num = Key_LastSta * 111 ;  			//长按
												//printf("Num:%d\r\n",KeyStruct.Num);
                    }
                    else
                    {
                        KeyStruct.W_TouchCounter_Flag = 1 ;
                        
                        if( KeyStruct.W_Touch_TimeCounter <= 20 )       //未超时
                        {
                            if( KeyStruct.NumSave == 0 )
                            {
                                KeyStruct.NumSave = Key_LastSta ;     // 第一次按下
                                KeyStruct.W_Touch_TimeCounter = 0 ;
                            }        
                            else
                            {
                                if( KeyStruct.NumSave == Key_LastSta )
                                {
                                    KeyStruct.NumSave = KeyStruct.NumSave * 11 ;  // 双击
//																		printf("\r\nNumSave:%d\r\n",KeyStruct.NumSave);
                                }        
                            }
                        }
                    }
                
                    KeyStruct.Key_TimeCounter = 0 ;
                
                }
                if( KeyStruct.W_TouchCounter_Flag == 1 && KeyStruct.W_Touch_TimeCounter >= 11 ) // 超时判断为单击
                {
 
                        KeyStruct.Num = KeyStruct.NumSave ;				
                        KeyStruct.W_TouchCounter_Flag = 0 ;				//清除标志位
                        KeyStruct.W_Touch_TimeCounter = 0 ;
                        KeyStruct.NumSave = 0 ;
//												printf("\r\nNum:%d\r\n",KeyStruct.Num);
                }       
            }
 
        }
    }

		

	
}

